#!/usr/bin/perl
#
# Permite formatear correctamente un fichero de reservas del DHCP
# quitando los espacios estos tan molestos
#

# Comprobar argumentos...
if ( 0 != $#ARGV ) {
  print STDERR "ERROR: No has pasado el fichero a formatear\n";
  exit 2;
}

# Abrir fichero
open(LEASES,$ARGV[0]) || die "ERROR: No puedo abrir [".$ARGV[0]."]\n";

# Para la conversion de fechas
use Date::Parse;
# Para el formateo de IPs
use Socket;

$InLease=0;
$parentesis=0;
while( chomp($linea=<LEASES>) ) {
   if ( ($linea=~m/\{/) && ($linea!~m/\"/) ) {
      # Hay una apertura de llaves
      $parentesis++;

      # Comprobar si es el comienzo de un Lease
      if ( $linea=~m/^\s*host\s+(\S+)\s+/ ) {
         $lease_name="$1";
         $InLease=1;
      }
   }elsif ( ($linea=~m/\}/) && ($linea!~m/\"/) ) {
      # Hay un cierre de llaves
      $parentesis--;

      if (( 1 == $InLease ) && ( 0 == $parentesis ) ) {
         $InLease=0;
         if (("" ne "$lease_IP") && ("" ne "$lease_mac")) {
            print "$unixtime#$IPaton#$lease_mac#$lease_name#\@$lease_IP#$lease_start#active#\n";
         }
         $lease_name="..SIN_NOMBRE..";
         $lease_IP="";
         $lease_mac="";
      }
   }elsif ((0 == $InLease) && ($linea=~m/^# (La registra.+\S)\s*$/))  {
      $lease_start=$1;
      if ($lease_start=~m/ el (\d+)\/(\d+)\/(\d+) a las (\d\S+) desde/ ) {
         $unixtime=str2time("$3/$2/$1 $4");
      }
   }elsif ((1 == $InLease) && ($linea=~m/\s+hardware ethernet\s+(\S[^\;]+)\;/))  {
      $lease_mac=$1;
   }elsif ((1 == $InLease) && ($linea=~m/\s+fixed-address\s+(\d[^;]+)\;/))  {
      $lease_IP="$1";
      $IPaton=&ip2dec($1);
   }
}
close(LEASES);


# Funcion para formatear una direccion IP a numero ordenable
sub ip2dec ($) {
  return unpack N => pack CCCC => split /\./ => shift;
}

